package org.dev.hi.hiui.refresh;

import android.content.Context;
import android.util.AttributeSet;
import android.widget.FrameLayout;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import org.dev.hi.library.util.HiDisPlayUtils;

/**
 * Author WenPing
 * CreateTime 2021/3/31.
 * Description:
 */

public abstract class HiOverView extends FrameLayout {

    public enum HirefreshState {
        /**
         * 初始状态
         */
        STATE_INIT,
        /**
         * Header显示状态
         */
        STATE_VISIBLE,
        /**
         * 超出可刷新距离的状态
         */
        STATE_OVER,
        /**
         * 刷新中的状态
         */
        STATE_REFRESH,
        /**
         * 超出刷新位置松开手后的状态
         */
        STATE_OVER_RELEASE
    }

    protected HirefreshState mState = HirefreshState.STATE_INIT;

    /**
     * 触发下拉刷新 需要的最小高度
     */
    public int mPullRefreshHeight;

    /**
     * 刷新时滑动的最小阻尼
     */
    public float minDamp = 1.6f;
    /**
     * 刷新时滑动的最大阻尼
     */
    public float maxDamp = 2.2f;

    public HiOverView(@NonNull Context context) {
        super(context);
        preInit();
    }

    public HiOverView(@NonNull Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        preInit();
    }

    public HiOverView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        preInit();
    }

    /**
     * 初始化方法
     */
    void preInit() {
        mPullRefreshHeight = HiDisPlayUtils.dp2px(66);
        init();
    }

    /**
     * 抽象的初始化方法，让具体的子类去实现
     */
    public abstract void init();

    protected abstract void onScroll(int scrollY, int pullRefreshHeight);

    /**
     * 显示刷新视图view
     */
    protected abstract void onVisible();

    /**
     * 超过Overlay，释放就会加载
     */
    public abstract void onOver();

    /**
     * 开始加载
     */
    public abstract void onRefresh();

    /**
     * 加载完成
     */
    public abstract void onFinish();

    /**
     * 设置当前刷新的状态
     *
     * @param state
     */
    public void setState(HirefreshState state) {
        this.mState = state;
    }

    /**
     * 获得当前的刷新状态
     *
     * @return
     */
    public HirefreshState getState() {
        return mState;
    }
}
